package com.jt.service;

import com.jt.vo.ImageVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;

@Service
public class FileServiceImpl implements FileService{
    private String localDir="E:/images";
    private String urlPath="http://image.jt.com";

    /**
     * 考虑的问题:
     *      1. 校验图片类型    xx.jpg
     *      2. 校验是否为恶意程序 xx.exe.jpg
     *      3. 将文件分目录存储.
     *      4. 为了保证图片唯一性 ,自定义文件名称
     * @param file
     * @return
     */
    @Override
    public ImageVO upload(MultipartFile file) {
        ImageVO imageVO = new ImageVO();
        //第一步   检验图片类型
        String fileName = file.getOriginalFilename().toLowerCase();   //获取文件名全小写，防止判断错误
        //String.match正则表达式
        //如果不匹配任意.jpg/png/gif
        if (!fileName.matches("^.+\\.(jpg||png||gif)$")) return null;
        System.out.println("图片格式正确");

        //第二步   校验是否为恶意程序
        try {
            BufferedImage bufferedImage = ImageIO.read(file.getInputStream());
            int height = bufferedImage.getHeight();
            int width = bufferedImage.getWidth();
            if (height == 0 || width == 0) {
                System.out.println("该程序为恶意程序");
                return null;
            }
            System.out.println("用户上传的是图片");


            //第三步   将文件划区域存放
            //将当前日期转换为/yyyy/MM/dd/格式
            String dateUrl = new SimpleDateFormat("/yyyy/MM/dd/").format(new Date());
            //真实路径为 仓库路径+日期路径
            String dirPath = localDir + dateUrl;
            File dirFile = new File(dirPath);
            //如果文件夹不存在
            if (!dirFile.exists()) {
                //创建多级目录
                dirFile.mkdirs();
            }

            //第四步   自定义文件名称
            //  获取文件名 最后一个"."的位置
            String uuid = UUID.randomUUID().toString().replace("-", "");
            int index = fileName.lastIndexOf(".");
            //截取数据，只要从指定下标开始到结尾的数据
            String fileType = fileName.substring(index);
            //拼接文件名称
            String realFile = uuid + fileType;

            //第五步   文件上传
            String path = dirPath + realFile;
            //上传文件到指定路径
            file.transferTo(new File(path));
            System.out.println("文件上传成功");
            //返回ImageVO对象
            //6.1 虚拟路径只写动态变化的数据
            imageVO.setVirtualPath(dirPath+realFile);
            //6.2 真实图片名称
            imageVO.setFileName(realFile);
            //6.3 网络地址  http://image.jt.com/xx/uuid.jpg
            imageVO.setUrlPath(urlPath+dirPath+realFile);
            System.out.println(imageVO.getUrlPath());
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }
    @Override
    @Transactional
    public void deleteFile(String virtualPath){
        String path=localDir+virtualPath;
        File file=new File(path);
        if (file.exists()){
            file.delete();
        }
    }
}
